package ele.utils;

import app.nbdevices.utils.ConvertUtil;
import ele.modle.codecModle.EleDataField;
import ele.modle.codecModle.EleReport;
import ele.modle.revModle.RevEleReportData;

import java.util.ArrayList;

import static app.nbdevices.utils.ConvertUtil.arraySub;

/**
 * 电表解码器
 */
public class EleDataDecode {
    /*
      电表解析参数
    */
    //数据域差值
    static final byte DIFFER=0x33;
    //数据域开始位置
    static final byte DATA_FIELD_START=10;
        /**
         * @Description: 解码电表数据
         * @Param: 编解码插件数据模型
         * @Returns: 解码好的json对象
         */
    public static EleReport eleReportDataDecode(RevEleReportData revEleReportData){
        EleReport eleReport =new EleReport();
        byte[] res= ConvertUtil.getBase64Codec().decode(revEleReportData.getReportData());
        //判断是否是周期上报数据
        if(res[0]!=0x68){
            //地址域
            eleReport.setAddressField(arraySub(res,5,10));
            //控制码
            eleReport.setControlCode(res[12]);
            //数据长度
            eleReport.setDataLength(res[13]);
            eleReport.setDataField(arraySub(res,DATA_FIELD_START+4,DATA_FIELD_START+4+eleReport.getDataLength()-1));
        }else{
            //用于存放数据域，ArrayList初始容量大小为10，足够用来存放数据域，不需要扩容
            ArrayList<EleDataField> eledatafields=new ArrayList<>();
            //地址域
            eleReport.setAddressField(arraySub(res,1,6));
            //控制码
            eleReport.setControlCode(res[8]);
            //数据长度
            eleReport.setDataLength(res[9]);
            //数据域初始位置
            byte count=DATA_FIELD_START;
            //第一个数据域长度
            byte length=0;
            while((count-res[9])!=DATA_FIELD_START) {
                //更新下一个数据域长度
                length = (byte) (res[count + 4] - DIFFER);
                EleDataField eledatafield = new EleDataField();
                //数据域数据标识
                eledatafield.setDataId(dataSubOffset(arraySub(res, count, count + 3)));
                //数据域长度
                eledatafield.setDataLength(length);
                //数据内容
                eledatafield.setData(dataSubOffset(arraySub(res, count + 5, count + 5 + length - 1)));
                //添加数据域
                eledatafields.add(eledatafield);
                //更新下一个数据域开始位置
                count += length + 5;
            }
            eleReport.setDataFields(eledatafields);
        }
        return eleReport;
    }
    public static byte[] dataSubOffset(byte[] src){
        for(int i=0;i<src.length;i++){
            src[i]-=DIFFER;
        }
        return src;
    }

    public static void main(String[] args) {
//        RevEleReportData revEleReportData=new RevEleReportData();
//        revEleReportData.setReportData("aAEABgYZIGiGdzQ1Ozg9PDMzMzMzMzMzMzQzOTg4MzNGN1M0NDk4RzrKMzMzMzMzmGczM8NbMzOEZjMzNDU5OEfGxDYzMzMzM8ZYNDOEazQze1o0MzMyNDNHOsozMzMzMzOYZzMzw1szM4RmMzMyODM3QTMzMzPDdTMzMzMzMzM1NBY=");
//        revEleReportData.setReportData("aDUBABAIGWiGKDMzMzM3VDMzMz80Mzc6ZFhGNEY3UzI4MzdBMzNDMzM1MzMzMzMzMzPjFg==");
//   //     eleReportDataDecode(revEleReportData);
//        byte[] res= ConvertUtil.getBase64Codec().decode(revEleReportData.getReportData());
//        System.out.println(res.length);
//        for(byte r:res){
//            System.out.print(Integer.toHexString(r&0xFF)+" ");
//        }
//        eleReportDataDecode(revEleReportData);
      //  System.out.println(ConvertUtil.getBase64Codec().decode(revEleReportData.getReportData()));
    }
}
